package net.xiaosaguo.mymall.cart.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;

/**
 * description: Session 自定义配置
 * <p>
 * SpringSession 核心原理：
 * 1. @EnableRedisHttpSession 导入了 RedisHttpSessionConfiguration 配置
 * -    1. 给容器中添加组件：
 * -        SessionRepository >>> RedisIndexedSessionRepository：redis 操作 session，session 的增删改查封装类
 * -    2. 初始化 CookieSerializer
 * -        extends SpringHttpSessionConfiguration：@PostConstruct init():CookieSerializer
 * -    3. 添加过滤器：SessionRepositoryFilter==>Filter: session 存储过滤器:每个请求过来都必须经过filter
 * -        1. 在创建的时候，就自动从容器中获取到了 SessionRepository
 * -        2. 原始的 request、response 都被包装成了 SessionRepositoryRequestWrapper、SessionRepositoryResponseWrapper
 * -        3. 以后获取 session -> request.getSession()
 * -        4. 第三步相当于 wrappedRequest.getSession() --> SessionRepository.findById(sessionId) --> redis中获取到的
 * 实现方式：装饰者模式
 * <p>
 * Spring Session：考虑到很多实用需求，比如过期时间、自动续期等
 *
 * @author xiaosaguo
 * @date 2020/07/06
 */
@Configuration
public class SessionConfig {

    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("MYSESSIONID");
        serializer.setDomainName("mymall.com");
        // serializer.setCookiePath("/");
        // serializer.setDomainNamePattern("^.(\\w+\\.[a-z]+)$");
        // serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
        return serializer;
    }

    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
}
